package repository

import (
	"blog/internal/model"
	"context"
)

type UserRepository interface {
	Create(ctx context.Context, user *model.User) error
	GetByID(ctx context.Context, id uint) (*model.User, error)
	Update(ctx context.Context, user *model.User) error
	DeleteByID(ctx context.Context, id uint) error
	List(ctx context.Context) ([]*model.User, error)
	GetByUsername(ctx context.Context, username string) (*model.User, error)
	UpdateUserType(ctx context.Context, userID uint) error
}

func NewUserRepository(
	r *Repository,
) UserRepository {
	return &userRepository{
		Repository: r,
	}
}

type userRepository struct {
	*Repository
}

// Create 用户创建
func (r *userRepository) Create(ctx context.Context, user *model.User) error {
	if err := r.DB(ctx).Create(user).Error; err != nil {
		return err
	}
	return nil
}

// GetByID 根据 ID 查询用户
func (r *userRepository) GetByID(ctx context.Context, id uint) (*model.User, error) {
	var user model.User
	if err := r.DB(ctx).First(&user, id).Error; err != nil {
		return nil, err
	}
	return &user, nil
}

// Update 用户信息更新
func (r *userRepository) Update(ctx context.Context, user *model.User) error {
	if err := r.DB(ctx).Save(user).Error; err != nil {
		return err
	}
	return nil
}

// Delete 软删除用户
func (r *userRepository) DeleteByID(ctx context.Context, id uint) error {
	if err := r.DB(ctx).Delete(&model.User{}, id).Error; err != nil {
		return err
	}
	return nil
}

// List 列出所有未被删除的用户
func (r *userRepository) List(ctx context.Context) ([]*model.User, error) {
	var users []*model.User
	if err := r.DB(ctx).Where("delete_at IS NULL").Find(&users).Error; err != nil {
		return nil, err
	}
	return users, nil
}
func (r *userRepository) GetByUsername(ctx context.Context, username string) (*model.User, error) {
	var user model.User
	if err := r.DB(ctx).Where("user_name = ?", username).First(&user).Error; err != nil {
		return nil, err
	}
	return &user, nil
}

func (r *userRepository) UpdateUserType(ctx context.Context, userID uint) error {
	newType := model.UserTypeNormal
	return r.DB(ctx).
		Model(&model.User{}).
		Where("id = ?", userID).
		Update("type", newType).Error
}
